package com.kingwang.demo.springsecuritytokendemo.security;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;

/**
 * Token Session管理器
 * 用户应自行控制Session的过期行为：
 * 应采用事件触发、定时扫描等方式销毁过期的Session以保证内存不泄露
 *
 * @author King
 */
public interface TokenSessionManager {
    /**
     * 生成Session ID
     * 默认规则为 type:token
     *
     * @param type
     * @param token
     * @return
     */
    String generateSessionId(String type, String token);

    /**
     * 检查Session是否过期
     *
     * @param session
     * @return
     */
    boolean isExpired(TokenSession session);

    /**
     * 获取所有TokenSession
     *
     * @return
     */
    Collection<TokenSession> getSessions();

    /**
     * 使用Spring Security的Authentication对象或者UserDetails创建Session
     * 主要用于使用Token时遇到将要刷新还未刷新时遇到超时的情况
     *
     * @param tokenType
     * @param authentication
     * @param userDetails
     * @return
     */
    TokenSession createSession(String tokenType, Authentication authentication, UserDetails userDetails);

    /**
     * 使用用户信息创建Session
     *
     * @param tokenType
     * @param userDetails
     * @return
     */
    TokenSession createSession(String tokenType, UserDetails userDetails);

    /**
     * 获取Session
     *
     * @param id
     * @return
     */
    TokenSession getSession(String id);

    /**
     * 刷新Session
     *
     * @param session
     */
    void refreshSession(TokenSession session);

    /**
     * 删除Session
     *
     * @param session
     */
    void removeSession(TokenSession session);

    /**
     * 删除Session
     *
     * @param id
     */
    void removeSession(String id);
}
